Tensor

Tensor 张量
张量是数学和物理学中的一个基本概念,它是标量 Scalar 和向量 Vector 的推广。

张量可以被视为一种多线性函数,它将一组向量映射到一个标量,或者将一组向量映射到另一个向量。

在微分几何 Differential Geometry 中,张量是在流形 Manifold 上定义的多线性对象,可以用于描述流形的几何和物理性质,如度规张量 Metric Tensor 和曲率张量 Curvature Tensor。

张量的阶数

张量的阶数(或秩)表示其所包含的指标数量。阶数越高,张量描述的物理量越复杂。

张量的表示

张量通常用分量表示,其分量值取决于所选择的坐标系 Coordinate System。张量的一个重要特性是其分量在坐标变换下的特定变换规律。

张量的运算

张量可以进行多种运算:

PyTorch

PyTorch

Tensors are a specialized data structure that are very similar to arrays and matrices.

In PyTorch, we use tensors to encode the inputs and outputs of a model, as well as the model’s parameters.

张量是一种特殊的数据结构,与数组和矩阵非常相似。在 PyTorch 中,我们使用张量来编码模型的输入和输出,以及模型的参数。

张量操作

初始化张量

python
data = [[1, 2],[3, 4]]

# 直接从数据初始化
x_data = torch.tensor(data)

# 从 NumPy 数组创建
np_array = np.array(data)
x_np = torch.from_numpy(np_array)

# 从另一个张量初始化:新张量默认保留参数张量的属性(形状、数据类型)

## retains the properties of x_data
x_ones = torch.ones_like(x_data) 
print(f"Ones Tensor: \n {x_ones} \n")

## overrides the datatype of x_data 
x_rand = torch.rand_like(x_data, dtype=torch.float) 
print(f"Random Tensor: \n {x_rand} \n")

张量的属性

python
tensor = torch.rand(3,4)

print(f"Shape of tensor: {tensor.shape}")
print(f"Datatype of tensor: {tensor.dtype}")
print(f"Device tensor is stored on: {tensor.device}") 

其他操作

超过 1200 种张量操作,包括算术、线性代数、矩阵操作(转置、索引、切片)、采样等(见 Tensor API 与 NumPy API 十分类似 )

这些操作中的每一种都可以在 CPU 和加速器(如 CUDA、MPS、MTIA 或 XPU)上运行。默认情况下,张量在 CPU 上创建。我们需要使用 .to 方法显式地将张量移动到加速器

与 MumPy 桥接

CPU 上的张量和 NumPy 数组可以共享它们的底层内存位置,更改其中一个会改变另一个。

python
# 张量到 NumPy 数组,张量的变化会反映在 NumPy 数组中。
t = torch.ones(5)
n = t.numpy()
t.add_(1)  # 同时改变 n


# NumPy 数组到张量,NumPy 数组的变化会反映在张量中。
n = np.ones(5)
t = torch.from_numpy(n)
np.add(n, 1, out=n) # 同时改变 t 

张量的应用

在物理学中的应用

张量是物理学中描述物理量和物理定律的强大工具,特别是在弯曲空间和相对论中:

在机器学习中的应用

在机器学习 Machine Learning 和深度学习 Deep Learning 中,“张量”通常指多维数组。尽管这里的“张量”概念与数学物理中的张量略有不同(不强调坐标变换下的不变性),但其多维数组的特性使其成为处理和操作高维数据的核心数据结构: